#异常处理概述
"""
爬虫在运行过程中，很多时候都会遇到这样或那样的异常。如果没有异常吹，爬虫遇到异常时就会直接崩溃停止运行，下次再运行时，优惠重投开始，所以要开发一个具有
顽强生命力的爬虫，必须要进行异常处理
"""
#常见状态码及含义
"""
200 OK  一切正常
301 Moved Permanently
302 Found 重定向到临时的URL,非永久性
400 Bad Request 非法请求
401 Unauthorized    请求未经授权
403 Forbidden   禁止访问（***）
404 Not Found   没有找到对应页面
500 Internal Server Error   服务器内部出现错误
501 Not Implemented 服务i内部不支持实现请求所需要的功能
"""

#URLError 与 HTTPError
#异常处理实战

import urllib.request
import urllib.error
try:
    #urllib.request.urlopen("http://blog.csdn.net"),这个网址好像没有反爬虫了
    urllib.request.urlopen("https://read.douban.com/provider/all")
except urllib.error.URLError as e:
    print(e.code)
    print(e.reason)

"""
产生URLError的原因有如下几种可能：
    1）连接不上服务器
    2）远程URL不存在
    3）无网络
    4）触发了HTTPError（是一个URLError的子类）
    显然，上面代码产生的URLError异常属于第四种情况，所以，可以用HTTPError代替URLError：

import urllib.request
import urllib.error
try:
    #urllib.request.urlopen("http://blog.csdn.net"),这个网址好像没有反爬虫了
    urllib.request.urlopen("https://read.douban.com/provider/all")
except urllib.error.HTTPError as e:
    print(e.code)
    print(e.reason)
"""

#(第一次优化)实际处理异常时，并不清楚使用HTTPError能不能处理，可以进行如下优化：先让HTTPError子类进行处理，无法处理，再让URLError进行处理
import urllib.request
#在try块里面，所以他认为我们没用这个包
import urllib.error
try:
    #urllib.request.urlopen("http://blog.csdn.net"),这个网址好像没有反爬虫了
    urllib.request.urlopen("https://read.doubadausdahdn.com")
except urllib.error.HTTPError as e:
    print(e.code)
    print(e.reason)
except urllib.error.URLError as e:
    #URLError只有e.reason,没有e.code
    print(e.reason)

#（第二次优化）整合，用URLError一个类处理完
import urllib.error
try:
    urllib.request.urlopen("https://read.doubadausdahdn.com")
except urllib.error.URLError as e:
    if hasattr(e,"code"):
        print(e.code)
    if hasattr(e,'reason'):
        print(e.reason)
